package com.gsbelarus.gedemin.income.activity;

import android.content.Intent;
import android.os.AsyncTask;
import android.os.Bundle;
import android.os.Handler;
import android.view.Menu;

import com.gsbelarus.gedemin.income.R;
import com.gsbelarus.gedemin.income.sync.DataBaseHelper;

public class SplashScreen extends SyncActivity {

    private PreparingLaunch task;
    private long startTimeMilliseconds;
    private static final long MIN_INTERVAL_MILLISECONDS = 2000;

    /**
     * @return id View для отрисовки в активити
     */
    @Override
    public int getViewId() {
        return R.layout.activity_splash_screen;
    }

    @Override
    public boolean isShowingToolbar() {
        return false;
    }

    /**
     * вызывается в методе onCreate(Bundle)
     *
     * @param arguments bundle с агрументами
     */
    @Override
    public void onCreateActivity(Bundle arguments) {
        super.onCreateActivity(arguments);
        startTimeMilliseconds = System.currentTimeMillis();
        restartPreparingLaunch();
    }

    /**
     * сделать что-то после успешного или неуспешного обновления БД
     */
    @Override
    public void onFinishUpdateDB() {
        /** если во время подготовки к запуску база данных изменена, перезапускаем подготовку к запуску */
        restartPreparingLaunch();
    }

    @Override
    protected void onResume() {
        super.onResume();
        if (task != null && task.isPreparingCompleted)
            showApp();
    }

    /**
     * Перезапуск фонового потока для подготовки к запуску
     */
    private void restartPreparingLaunch() {
        if (task != null)
            task.cancel(true);
        task = new PreparingLaunch();
        task.executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR);
    }

    private void showApp() {
        Intent mainIntent = new Intent(this, Main.class);
        startActivity(mainIntent);
        finish();
    }

    private class PreparingLaunch extends AsyncTask<Void, Void, Void> {

        public volatile boolean isPreparingCompleted = false;

        @Override
        protected Void doInBackground(Void... voids) {
            /** создаем таблицы, если не созданы*/
            DataBaseHelper dataBaseHelper = DataBaseHelper.getInstance(getApplicationContext());
            dataBaseHelper.createDataBase();

            /** инициализируем временные переменные */
            dataBaseHelper.initTempVar();
            isPreparingCompleted = true;
            return null;
        }

        @Override
        protected void onPostExecute(Void aVoid) {
            super.onPostExecute(aVoid);

            long elapsedTimeMilliseconds = System.currentTimeMillis() - startTimeMilliseconds;

            /** если на подготовку к запуску потребовалось больше времени чем MIN_INTERVAL_MILLISECONDS, выставляем задержку 0,
             * иначе - разницу между MIN_INTERVAL_MILLISECONDS и временем которое прошло
             */
            if (elapsedTimeMilliseconds < MIN_INTERVAL_MILLISECONDS)
                elapsedTimeMilliseconds = MIN_INTERVAL_MILLISECONDS - elapsedTimeMilliseconds;
            else
                elapsedTimeMilliseconds = 0;

            new Handler().postDelayed(new Runnable() {
                @Override
                public void run() {
                    /** открываем приложение только если активити (splash screen) активна и статус cancel == false */
                    if (isActivityVisible && !isCancelled())
                        showApp();
                }
            }, elapsedTimeMilliseconds);
        }
    }

    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        return false;
    }
}
